﻿/**
 * @file PlatformLink.h
 * @date 2021/07/08 10:41
 * @author joehuang huangge.cool@163.com
 * @brief 中台网络连接
 * @details 
 * @version v1.0.0
 * @copyright Copyright © 2021 All Rights Reserved 上海欢乐互娱网络科技有限公司
*/

#pragma once
#include "platform_link.h"


namespace link_util {
class PlatformLinkImpl : public PlatformLink
{
public:
    PlatformLinkImpl() {}
    virtual ~PlatformLinkImpl() override;
public:
    /**
    * 初始化中台环境
    * @method: Init
    * @return: bool 是否初始化成功
    */
    virtual bool Init() override;

    /**
    * 销毁中台环境
    * @method: UnInit
    * @return: void 空
    */
    virtual void UnInit() override;

    /**
    * 连接指定IP和端口
    * @method: Connect
    * @param: std::string ip ip地址
    * @param: std::uint32_t port 端口号
    * @return: bool 是否连接成功
    */
    virtual bool Connect(const std::string &ip, std::uint32_t port) override;

    /**
    * 更新网络和RPC事件
    * @method: Update
    * @return: void 空
    */
    virtual void Update() override;

    // /**
    // * 根据代理模版参数创建代理对象
    // * @method: createProxy
    // * @return: std::shared_ptr<T> 创建的代理指针对象
    // */
    // template<typename T>
    // std::shared_ptr<T> CreateProxy();
    
   private:
    /**
    * 获取RpcImpl对象指针
    * @method: GetRpcImpl
    * @return: rpc::RpcImpl* 返回RpcImpl对象指针 
    */
    rpc::RpcImpl* GetRpcImpl();

    /**
    * 获取RpcImpl对象基类指针
    * @method: GetRpc
    * @return: rpc::Rpc* 返回RpcImpl对象基类指针 
    */
    virtual rpc::Rpc* GetRpc() override;

    /**
    * 创建网络连接对象
    * @method: MakeTranport
    * @return: void
    */
    void MakeTransport();

    /**
    * 获取网络连接对象
    * @method: GetTransport
    * @return: std::shared_ptr<rpc::Transport> 返回网络连接对象指针
    */
    virtual std::shared_ptr<rpc::Transport> GetTransport() override;
    
    /**
     * @brief 协程启动
     *
     * @param entry 协程入口函数
     */
    virtual void CoroStart(const coroutine::CoroEntry& entry) override;

    /**
    * 连接管道事件回调处理函数
    * @method: connector_cb
    * @param: kchannel_ref_t * channel 连接管道
    * @param: knet_channel_cb_event_e e 网络事件
    * @return: void 空
    */
    static void ConnectCb(kchannel_ref_t* channel, knet_channel_cb_event_e e);
private:
    PlatformLogger logger;                  ///< 日志对象
    kloop_t* loop{nullptr};                  ///< 网络循环对象
    kchannel_ref_t* connector{nullptr};     ///< 连接管道引用对象
    std::shared_ptr<PlatformTrans> trans;   ///< 中台Transport
    std::shared_ptr<rpc::RpcImpl> rpc_impl; ///< RpcImpl实现对象指针
};
}